This project analyzes the used car market to provide actionable insights for dealerships and automotive marketers. Using a dataset of 98,836 vehicle listings across 9 major brands (Mercedes, BMW, Audi, VW, Toyota, Ford, Hyundai, Skoda, and Vauxhall), we examined pricing optimization, market segmentation, and brand positioning strategies.
The primary challenge facing automotive dealerships is identifying which vehicle attributes consumers find most desirable and understanding how to strategically price and position inventory to maximize profitability while meeting diverse customer needs.
Through conducting exploratory data analysis, K-means clustering, PCA visualization, logistic regression, and multiple linear regression, we identified key market trends, customer segments, and brand positioning opportunities that can guide inventory acquisition, pricing decisions, and targeted marketing strategies.
Problem Statement
The used car market presents significant challenges for dealerships seeking to optimize their operations and marketing strategies. With thousands of vehicles varying across brand, age, mileage, engine specifications, and fuel type, dealerships struggle to make data-driven decisions about three critical areas:
1.Pricing Optimization
How should dealerships price their inventory to remain competitive while maximizing profit margins? Which vehicle attributes have the strongest influence on price, and how can this knowledge inform acquisition and pricing strategies?
2.Market Segmentation
Who are the target customers in the used car market? Can distinct buyer segments be identified based on vehicle preferences, and how should marketing efforts be tailored to reach each segment effectively?
3.Brand Positioning
How do automotive brands compare in terms of perceived value and market positioning? Which brands command premium pricing, and where do opportunities exist for competitive differentiation?
This project addresses these challenges by leveraging a dataset of 98,836 vehicle listings to uncover actionable insights that support strategic pricing, targeted marketing, and competitive positioning in the used car market.
Data Description
Aggregated dataset complied from multiple online automotive marketplace listings.
Observations: 98,837
Variables (10):
• Categorical: Brand, Model, Transmission, Fuel Type
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: statsmodels in /home/vscode/.local/lib/python3.12/site-packages (0.14.6)
Requirement already satisfied: numpy<3,>=1.22.3 in /home/vscode/.local/lib/python3.12/site-packages (from statsmodels) (2.3.2)
Requirement already satisfied: scipy!=1.9.2,>=1.8 in /home/vscode/.local/lib/python3.12/site-packages (from statsmodels) (1.16.1)
Requirement already satisfied: pandas!=2.1.0,>=1.4 in /home/vscode/.local/lib/python3.12/site-packages (from statsmodels) (2.3.2)
Requirement already satisfied: patsy>=0.5.6 in /home/vscode/.local/lib/python3.12/site-packages (from statsmodels) (1.0.2)
Requirement already satisfied: packaging>=21.3 in /home/vscode/.local/lib/python3.12/site-packages (from statsmodels) (25.0)
Requirement already satisfied: python-dateutil>=2.8.2 in /home/vscode/.local/lib/python3.12/site-packages (from pandas!=2.1.0,>=1.4->statsmodels) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /home/vscode/.local/lib/python3.12/site-packages (from pandas!=2.1.0,>=1.4->statsmodels) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in /home/vscode/.local/lib/python3.12/site-packages (from pandas!=2.1.0,>=1.4->statsmodels) (2025.2)
Requirement already satisfied: six>=1.5 in /home/vscode/.local/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas!=2.1.0,>=1.4->statsmodels) (1.17.0)
# Loading and Cleaning Data with Polars# Load datacars = pl.read_csv("Final_dataset.csv", ignore_errors=True)cars = cars.drop_nulls()# View the first few rows of the datacars.head() # Summary of dataset# Reason: Quick overview of the cleaned dataset.print("Shape:", cars.shape) # number of rows and columnsprint("\nColumn types:")print(cars.schema) # check data typesprint("\nSummary statistics:")cars.describe()cars.head()
# Filter out extreme outliers for better visualizationcars_filtered = cars.filter(pl.col("price") <=50000)fig = px.histogram( cars_filtered.to_pandas(), x="price", nbins=50, title="Price Distribution in Used Car Market", labels={"price": "Price ($)", "count": "Number of Vehicles"}, color_discrete_sequence=["#3498db"])fig.add_vline( x=cars_filtered["price"].mean(), line_dash="dash", line_color="red", annotation_text=f"Mean: ${cars_filtered['price'].mean():,.0f}", annotation_position="top right")fig.add_vline( x=cars_filtered["price"].median(), line_dash="dot", line_color="green", annotation_text=f"Median: ${cars_filtered['price'].median():,.0f}", annotation_position="top left")fig.update_layout( height=500, width=1000, title=dict( text="<b>Price Distribution in Used Car Market</b>", font=dict(size=20), x=0.5, xanchor="center" ), xaxis=dict( title="Price ($)", tickprefix="$", tickformat=",.0f" ), yaxis=dict(title="Number of Vehicles"), margin=dict(l=80, r=50, t=80, b=60))fig.show()# Note how many cars were filteredtotal = cars.shape[0]filtered = cars_filtered.shape[0]print(f"Showing {filtered:,} of {total:,} vehicles ({filtered/total*100:.1f}%) - filtered to prices ≤ $50,000")
Showing 97,686 of 98,836 vehicles (98.8%) - filtered to prices ≤ $50,000
Key Findings
Right-Skewed Distribution:
The price distribution exhibits a classic right-skewed pattern, with most vehicles clustered in lower price ranges and a long tail extending toward premium prices. This reflects a market dominated by affordable, mass-market vehicles.
Mean vs Median Gap:
The mean price exceeds the median, confirming the presence of high-priced outliers likely luxury and premium vehicles that inflate the average. The median serves as a more accurate measure of typical used car pricing.
Price Concentration:
The majority of inventory falls within the $10,000–$25,000 range, representing the market’s sweet spot where buyers seek the best balance of value and reliability.
Market Accessibility:
A substantial portion of vehicles priced under $15,000 indicates strong availability for budget-conscious consumers and first-time buyers entering the market.
Premium Segment:
Vehicles exceeding $35,000 represent a smaller but significant segment, typically comprising newer models, luxury brands, and low-mileage vehicles.
Marketing Implications:
Pricing Strategy:
Dealerships should concentrate inventory acquisition and marketing efforts on the $10K–$25K range where buyer demand is strongest.
Segmented campaigns:
Create unique marketing strategies: value-focused messaging for budget consumers (less $15K) and premium positioning for luxury purchasers (above $35K).
Competitive Positioning:
Vehicles priced near the median offer optimal balance between market competitiveness and profit margin potential.
Financing Options:
Promote financing solutions for vehicles above the median price to increase accessibility and expand the potential buyer pool.
Visualization: Market Share By Brand (EDA)
fig = px.pie( brand_summary.to_pandas(), names="Brand", values="count", title="Market Share by Brand (Count of Listings)")fig.show()
Market Segmentation using Clustering (k-means analysis)
def create_pipeline(num_clusters, random_seed =42):""" Creates a machine learning pipeline with a scaler and KMeans. """ pipeline = Pipeline([ ('scaler', StandardScaler()), ('kmeans', KMeans(n_clusters=num_clusters, random_state=random_seed)) ])return pipeline
Determining Optimal clusters through Elbow Plot
def calculate_totwithinss(data, k): kmeans_pipeline = create_pipeline(k, random_seed=10) kmeans_pipeline.fit(data)return kmeans_pipeline['kmeans'].inertia_# Calculate tot.withinss for different values of kk_values =range(1, 10)totwithinss_values = [calculate_totwithinss(cars_bases, k) for k in k_values]# Create a DataFrame for resultskmeans_results = pl.DataFrame( {'num_clusters': k_values,'tot_withinss': totwithinss_values})# Plot the elbow method using Plotly Expresselbow_plot = px.line( data_frame = kmeans_results, x ='num_clusters', y ='tot_withinss', markers =True, labels = {'num_clusters': 'Number of Clusters', 'tot_withinss': 'Total Within SS' }, title ='Elbow Method for Optimal k')elbow_plot.show()
Based on the elbow method, four clusters were chosen because they provide the best balance between model simplicity and meaningful separation of distinct vehicle groups in the used car market.
K Means Clustering
# Choose the number of clusters based on the elbow methodoptimal_k =4# Run K-means clusteringcars_kmeans_pipeline = create_pipeline(optimal_k)cars_kmeans_pipeline.fit(cars_bases)# Add cluster assignments to the original datacars_with_clusters = cars.with_columns( pl.Series("segment_number", cars_kmeans_pipeline['kmeans'].labels_ +1 ).cast(pl.Utf8).cast(pl.Categorical) # Make cluster labels 1-indexed)cars_with_clusters.head()
shape: (5, 11)
Brand
model
year
price
transmission
mileage
fuelType
tax
mpg
engineSize
segment_number
str
str
i64
i64
str
i64
str
i64
f64
f64
cat
"VW"
"T-Roc"
2019
25000
"Automatic"
13904
"Diesel"
145
49.6
2.0
"3"
"VW"
"T-Roc"
2019
26883
"Automatic"
4562
"Diesel"
145
49.6
2.0
"3"
"VW"
"T-Roc"
2019
20000
"Manual"
7414
"Diesel"
145
50.4
2.0
"1"
"VW"
"T-Roc"
2019
33492
"Automatic"
4825
"Petrol"
145
32.5
2.0
"3"
"VW"
"T-Roc"
2019
22900
"Semi-Auto"
6500
"Petrol"
150
39.8
1.5
"1"
Segment Description:
Analyzing the segments based on mean values of key metrics and the number of observations in each segment.
# Calculating summary statistics for each segmentsegment_summary = cars_with_clusters.group_by('segment_number').agg( [ pl.mean('price').alias('mean_price'), pl.mean('mileage').alias('mean_mileage'), pl.mean('engineSize').alias('mean_engineSize'), pl.len().alias('n') ])segment_summary
shape: (4, 5)
segment_number
mean_price
mean_mileage
mean_engineSize
n
cat
f64
f64
f64
u32
"2"
11232.150296
57132.047022
1.957311
10293
"1"
14764.997357
15145.826807
1.415791
47294
"3"
32028.494608
9038.880616
2.308308
18453
"4"
11197.826241
35593.776145
1.522789
22796
Customer Segmentation Conclusion
The customer segmentation analysis successfully identified four clusters,through the elbow method.
Cluster 1:
Represents mid-range cars with moderate prices (~$14,765), average mileage (~15,146), and smaller engines (~1.42 L). Likely balanced options between affordability and performance.
Cluster 2:
Consists of budget or older vehicles with the lowest mean price (~$11,232) but highest mileage (~57,132), indicating heavy usage and smaller engine capacity (~1.96 L).
Cluster 3:
Represents premium or high-performance vehicles, having the highest mean price (~$32,028), lowest mileage (~9,039), and largest engine size (~2.31 L) — suggesting newer or luxury cars.
Cluster 4:
Also economy-oriented, with a similar low price (~$11,198) and moderate mileage (~35,594). Slightly smaller engines (~1.52 L), possibly compact cars.
PCA Visualization of K-Means Clustering
from sklearn.decomposition import PCA# Standardize the features manually for PCAscaler = StandardScaler()scaled_features = scaler.fit_transform(cars_bases.to_pandas())# Reduce to 2 dimensionspca = PCA(n_components=2)pca_components = pca.fit_transform(scaled_features)# Add PCA components + cluster labels to dataframepca_df = pd.DataFrame({"PC1": pca_components[:, 0],"PC2": pca_components[:, 1],"Cluster": cars_kmeans_pipeline['kmeans'].labels_ +1})
PCA is a dimensionality reduction technique. When we have many variables (price, mileage, engine size, mpg, year, tax), it becomes difficult to plot them all together. Since clustering happens in a 6-dimensional space, PCA reduces it to a 2-D plot so humans can visualize the groupings.
Axes meaning (PC1 and PC2)
PC1 (horizontal axis) captures the largest pattern in the data. It often represents a combined effect of price + engine size + year (newer, premium cars on one side, older budget cars on the other).
PC2 (vertical axis) captures the second largest pattern. Often relates to mileage + efficiency variation.
Visualizations for Market Segmentation (dashboard)
STEP 1: PREPARE DATA FOR CLUSTERING
# Convert Polars to Pandas (add this before your clustering code)df = cars.to_pandas()# Then your clustering code will workcluster_features = ['price', 'mileage', 'mpg', 'engineSize', 'year']X = df[cluster_features].dropna()print(f"\nClustering on {len(X):,} vehicles with features: {cluster_features}")scaler = StandardScaler()X_scaled = scaler.fit_transform(X)
Clustering on 98,836 vehicles with features: ['price', 'mileage', 'mpg', 'engineSize', 'year']
Segmentation visualization saved as 'market_segmentation.png'
1.Price Distribution Across Clusters
Cluster 3:
Shows the highest prices and the largest spread, with many extreme high-value outliers. This segment represents premium buyers willing to spend significantly more. Ideal for luxury products, premium packages, and high-value upselling.
Cluster 1:
Falls into the mid-range with stable price behavior. These customers look for value but are not price-sensitive, making them good targets for balanced offers, loyalty programs, and add-on bundles.
Cluster 4:
Shows lower-mid pricing, with a relatively tight distribution. These customers prefer affordable but decent-quality options. Best suited for discount campaigns, value packs, and entry-level products.
Cluster 2:
Has the lowest median prices and limited high-price purchases. This segment is the most budget-conscious, responding well to price cuts, seasonal promotions, and low-cost alternatives.
2.Mileage Distribution Across Clusters
Cluster 2:
Has the highest mileage and the widest spread, indicating older or heavily used vehicles. This segment is ideal for maintenance plans, repair services, and high-wear part replacements.
Cluster 4:
Shows moderate-to-high mileage, suggesting frequent drivers. They are strong candidates for routine service reminders, safety checks, and periodic maintenance offers.
Cluster 1:
Displays mid-range mileage, reflecting balanced usage. They fit well with standard service intervals, tune-up promotions, and value-based maintenance packages.
Cluster 3:
Has the lowest mileage, indicating newer or lightly used vehicles. Marketing should emphasize premium upgrades, accessories, detailing services, and extended warranties, not heavy repair-oriented messaging.
3.Engine Size Distribution Across Clusters
Cluster 3:
Shows the largest engine sizes, including many high-end outliers. This indicates customers who prefer powerful, performance-oriented vehicles. Ideal for marketing premium performance packages, fuel additives, and high-end service plans.
Cluster 1:
Has the smallest and most compact engine sizes, with a tight distribution around lower engine ranges. These customers favor economical, fuel-efficient vehicles, making them good targets for budget maintenance services and efficiency-focused offers.
Cluster 4:
Shows moderate engine sizes, indicating a balance between power and efficiency. They represent a versatile group suited for general service promotions, mid-range upgrades, and value-focused maintenance.
Cluster 2:
Has small-to-mid engine sizes with some higher outliers. This group mixes practicality with occasional preference for slightly more powerful vehicles. Marketing can focus on balanced service packages and flexible upgrade options.
Targeting
car = cars_with_clusters.to_pandas()X = car[['year','price','mileage','tax','mpg','engineSize']]y = car['segment_number'].astype(int)
/home/vscode/.local/lib/python3.12/site-packages/sklearn/linear_model/_logistic.py:1272: FutureWarning:
'multi_class' was deprecated in version 1.5 and will be removed in 1.7. From then on, it will always use 'multinomial'. Leave it to its default value to avoid this warning.
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
steps
[('scaler', ...), ('model', ...)]
transform_input
None
memory
None
verbose
False
Parameters
copy
True
with_mean
True
with_std
True
Parameters
penalty
'l2'
dual
False
tol
0.0001
C
1.0
fit_intercept
True
intercept_scaling
1
class_weight
None
random_state
None
solver
'lbfgs'
max_iter
2000
multi_class
'auto'
verbose
0
warm_start
False
n_jobs
None
l1_ratio
None
BRAND POSITIONING (Binary Outcome Prediction) Premium vs Non-Premium Cars
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
The logistic regression model accurately predicts premium vs. non-premium cars (98% accuracy), with very low misclassification rates, making it highly reliable for pricing, segmentation, and inventory strategy
import seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.metrics import confusion_matrixcm = confusion_matrix(y_test, y_pred)plt.figure(figsize=(6,4))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Non-Premium','Premium'], yticklabels=['Non-Premium','Premium'])plt.title("Confusion Matrix for Premium Car Classification")plt.xlabel("Predicted")plt.ylabel("Actual")plt.show()
import seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.metrics import confusion_matriximportance = binary_pipe.named_steps['model'].coef_[0]features = X.columnsimp_df = pd.DataFrame({"feature": features,"importance": importance}).sort_values(by="importance", ascending=False)plt.figure(figsize=(7,4))sns.barplot(data=imp_df, x="importance", y="feature", palette="viridis")plt.title("Feature Importance for Premium Prediction (Logistic Regression)")plt.xlabel("Coefficient Value")plt.ylabel("Feature")plt.show()
/tmp/ipykernel_3569/1751013292.py:14: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `y` variable to `hue` and set `legend=False` for the same effect.
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
Engine Size & Year are the strongest premium drivers as larger engines (+2.291) and newer model years (+2.037) significantly increase premium likelihood—prioritize these attributes when acquiring inventory for premium positioning.
Mileage is the biggest negative factor as higher mileage (-1.288) strongly reduces premium classification—low-mileage vehicles retain value and should be priced accordingly.
Transmission type matters as Manual transmission (-0.620) decreases premium likelihood, while Semi-Auto (+0.477) and Automatic (+0.266) increase it—target automatic vehicles for premium buyers seeking convenience.
MPG has minimal impact as fuel efficiency (-0.010) barely influences premium status—premium buyers prioritize performance over economy.
Continuous Outcome Prediction
Downloading libraries
import polars as plimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.compose import ColumnTransformerfrom sklearn.preprocessing import StandardScaler, OneHotEncoderfrom sklearn.pipeline import Pipelinefrom sklearn.linear_model import LinearRegressionfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.svm import SVRimport plotly.express as pximport numpy as np
Train-test & Split(Continuous Outcome Prediction) (Polars to Pandas)
# Convert entire Polars DF into Pandas for the splitcars_pd = cars.to_pandas()train_pd, test_pd = train_test_split(cars_pd, test_size=0.3, random_state=11109)# Convert back to Polarstrain_df = pl.DataFrame(train_pd)test_df = pl.DataFrame(test_pd)
import statsmodels.api as smimport pandas as pdimport plotly.express as px# Convert Polars → Pandasdf = cars.to_pandas()# Features for predicting expected priceX = df[['engineSize', 'mileage', 'year', 'mpg', 'tax']]X = sm.add_constant(X)y = df['price']# Fit OLS regressionmodel = sm.OLS(y, X).fit()# Compute premium scoredf["expected_price"] = model.predict(X)df["premium_score"] = df["price"] - df["expected_price"]# Brand-level premium scorebrand_premium = ( df.groupby("Brand")["premium_score"] .mean() .sort_values(ascending=False) .reset_index())# --- Premium Score Bar Chart ---fig = px.bar( brand_premium, x="Brand", y="premium_score", title="Brand Premium Score (Actual Price vs Expected Price)", labels={"premium_score": "Avg Premium"}, color="premium_score", color_continuous_scale="RdYlGn", # Red → low premium, Green → high premium text="premium_score",)fig.update_traces(texttemplate='%{text:.0f}', textposition="outside")fig.update_layout(xaxis_tickangle=45, height=500)fig.show()
This chart compares each brand’s actual price with its expected price, generating a “premium score.” Audi and Mercedes command the highest positive premiums, indicating customers are willing to pay substantially more than expected, reflecting strong brand equity. VW and BMW show slight positive premiums, suggesting moderate brand strength. Ford and Skoda fall into mild negative territory, while Toyota, Hyundai, and especially Vauxhall have large negative premiums, meaning they sell for significantly less than expected. This signals weaker brand perception or strong price–value competition.
Marketing Implication:
Premium brands like Audi and Mercedes should continue leveraging their strong brand equity in messaging and maintain premium pricing strategies. VW and BMW can reinforce quality cues to further strengthen willingness to pay. Brands with negative premiums (Toyota, Hyundai, Vauxhall) should focus on improving perceived value through reliability messaging, product upgrades, or repositioning efforts. Vauxhall, with the deepest negative premium, may need rebranding or pricing adjustments to rebuild consumer trust and competitiveness.
This map compares average price versus average mileage for major car brands. BMW, Audi, and Mercedes remain positioned as premium brands, offering higher mileage but at significantly higher prices. VW sits in the mid-range with moderate pricing and mileage. Brands like Toyota, Hyundai, Ford, and Vauxhall cluster in the affordable segment, offering competitive mileage at lower price points. Skoda shows relatively lower mileage for its price, indicating a value–perception gap.
Marketing Implication:
Luxury brands should emphasize their balance of performance, comfort, and mileage to reinforce premium value. Mid-market brands like VW can market themselves as practical upgrades that offer strong mileage at reasonable prices. Budget brands (Toyota, Hyundai, Ford, Vauxhall) should highlight fuel efficiency and long-term cost savings for value-conscious buyers. Skoda may need to improve its mileage perception or adjust pricing to stay competitive in the value-driven segment.
This brand-positioning map compares average price vs. average engine size across car brands. BMW, Mercedes, and Audi occupy the premium segment, offering larger engines at significantly higher prices. Mid-market brands like VW sit in the center with moderate pricing and engine size. Meanwhile, Ford, Toyota, Hyundai, Skoda, and Vauxhall cluster in the affordable, smaller-engine segment, appealing to value-focused consumers. Overall, the chart highlights a clear separation between luxury and mass-market brands based on engine performance and price.
Marketing Implication:
The map highlights a clear premium vs. value split. Luxury brands (BMW, Mercedes, Audi) should continue emphasizing performance, engineering quality, and prestige to justify their higher prices. Mid-range brands like VW can position themselves as balanced choices combining reliability and moderate performance. Budget-focused brands (Toyota, Hyundai, Ford, Vauxhall) should reinforce value, fuel efficiency, and affordability. This segmentation helps brands tailor messaging, product strategy, and competitive positioning to their target consumer groups.
import polars as plimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# Set style for better presentationsns.set_style("whitegrid")plt.rcParams['font.family'] ='sans-serif'plt.rcParams['font.sans-serif'] = ['Arial']# Convert to pandas for analysisdf = cars.to_pandas()# Create the comprehensive price sensitivity dashboardfig = plt.figure(figsize=(20, 14))gs = fig.add_gridspec(2, 3, hspace=0.35, wspace=0.35)# Main title with better stylingfig.suptitle('COMPREHENSIVE PRICE SENSITIVITY ANALYSIS\nMarket Wheels - Understanding Price Drivers', fontsize=26, fontweight='bold', y=0.98, color='#1a1a2e')# Sample data for faster plotting if dataset is largeiflen(df) >10000: sample_df = df.sample(n=5000, random_state=42)else: sample_df = df# Define professional color schemeprimary_blue ='#4361EE'trend_red ='#EF233C'bar_color_1 ='#06D6A0'bar_color_2 ='#4CC9F0'# PLOT 1: Price Sensitivity to Mileageax1 = fig.add_subplot(gs[0, 0])ax1.scatter(sample_df['mileage'], sample_df['price'], s=15, alpha=0.5, c=primary_blue, edgecolors='white', linewidth=0.3)# Fit trend linez1 = np.polyfit(df['mileage'], df['price'], 1)p1 = np.poly1d(z1)x_line1 = np.linspace(df['mileage'].min(), df['mileage'].max(), 100)ax1.plot(x_line1, p1(x_line1), color=trend_red, linestyle='--', linewidth=3, alpha=0.85)ax1.set_xlabel('Mileage (miles)', fontsize=13, fontweight='bold', color='#2d3436')ax1.set_ylabel('Price ($)', fontsize=13, fontweight='bold', color='#2d3436')ax1.set_title('Price Sensitivity to Mileage', fontsize=15, fontweight='bold', pad=20, color='#1a1a2e')ax1.grid(True, alpha=0.25, linestyle='--', linewidth=0.8)ax1.set_facecolor('#f8f9fa')# Add correlation with better stylingcorr_mileage = df['mileage'].corr(df['price'])ax1.text(0.05, 0.95, f'Correlation: {corr_mileage:.3f}', transform=ax1.transAxes, fontsize=12, verticalalignment='top', fontweight='bold', color='#2d3436', bbox=dict(boxstyle='round,pad=0.6', facecolor='#fffbeb', edgecolor='#fbbf24', linewidth=2, alpha=0.9))# PLOT 2: Price Sensitivity to Vehicle Ageax2 = fig.add_subplot(gs[0, 1])ax2.scatter(sample_df['year'], sample_df['price'], s=15, alpha=0.5, c=primary_blue, edgecolors='white', linewidth=0.3)# Fit trend linez2 = np.polyfit(df['year'], df['price'], 1)p2 = np.poly1d(z2)x_line2 = np.linspace(df['year'].min(), df['year'].max(), 100)ax2.plot(x_line2, p2(x_line2), color=trend_red, linestyle='--', linewidth=3, alpha=0.85)ax2.set_xlabel('Year', fontsize=13, fontweight='bold', color='#2d3436')ax2.set_ylabel('Price ($)', fontsize=13, fontweight='bold', color='#2d3436')ax2.set_title('Price Sensitivity to Vehicle Age', fontsize=15, fontweight='bold', pad=20, color='#1a1a2e')ax2.grid(True, alpha=0.25, linestyle='--', linewidth=0.8)ax2.set_facecolor('#f8f9fa')# Add correlationcorr_year = df['year'].corr(df['price'])ax2.text(0.05, 0.95, f'Correlation: {corr_year:.3f}', transform=ax2.transAxes, fontsize=12, verticalalignment='top', fontweight='bold', color='#2d3436', bbox=dict(boxstyle='round,pad=0.6', facecolor='#fffbeb', edgecolor='#fbbf24', linewidth=2, alpha=0.9))# PLOT 3: Price Sensitivity to Engine Sizeax3 = fig.add_subplot(gs[0, 2])ax3.scatter(sample_df['engineSize'], sample_df['price'], s=15, alpha=0.5, c=primary_blue, edgecolors='white', linewidth=0.3)# Fit trend linez3 = np.polyfit(df['engineSize'], df['price'], 1)p3 = np.poly1d(z3)x_line3 = np.linspace(df['engineSize'].min(), df['engineSize'].max(), 100)ax3.plot(x_line3, p3(x_line3), color=trend_red, linestyle='--', linewidth=3, alpha=0.85)ax3.set_xlabel('Engine Size (Liters)', fontsize=13, fontweight='bold', color='#2d3436')ax3.set_ylabel('Price ($)', fontsize=13, fontweight='bold', color='#2d3436')ax3.set_title('Price Sensitivity to Engine Size', fontsize=15, fontweight='bold', pad=20, color='#1a1a2e')ax3.grid(True, alpha=0.25, linestyle='--', linewidth=0.8)ax3.set_facecolor('#f8f9fa')# Add correlationcorr_engine = df['engineSize'].corr(df['price'])ax3.text(0.05, 0.95, f'Correlation: {corr_engine:.3f}', transform=ax3.transAxes, fontsize=12, verticalalignment='top', fontweight='bold', color='#2d3436', bbox=dict(boxstyle='round,pad=0.6', facecolor='#fffbeb', edgecolor='#fbbf24', linewidth=2, alpha=0.9))# PLOT 4: Average Price by Transmission Type (VERTICAL BARS)ax4 = fig.add_subplot(gs[1, 0])trans_data = df.groupby('transmission')['price'].mean().sort_values(ascending=False)# Create gradient colorscolors_trans = plt.cm.viridis(np.linspace(0.3, 0.8, len(trans_data)))bars4 = ax4.bar(range(len(trans_data)), trans_data.values, color=colors_trans, alpha=0.85, edgecolor='#2d3436', linewidth=2.5)ax4.set_xticks(range(len(trans_data)))ax4.set_xticklabels(trans_data.index, rotation=0, ha='center', fontsize=11, fontweight='bold')ax4.set_ylabel('Average Price ($)', fontsize=13, fontweight='bold', color='#2d3436')ax4.set_title('Average Price by Transmission Type', fontsize=15, fontweight='bold', pad=20, color='#1a1a2e')ax4.grid(True, alpha=0.25, axis='y', linestyle='--', linewidth=0.8)ax4.set_facecolor('#f8f9fa')# Add value labels on bars with better stylingfor i, bar inenumerate(bars4): height = bar.get_height() ax4.text(bar.get_x() + bar.get_width()/2., height,f'${height:,.0f}', ha='center', va='bottom', fontsize=11, fontweight='bold', color='#2d3436', bbox=dict(boxstyle='round,pad=0.3', facecolor='white', alpha=0.8))# Set same y-axis range as fuel type plot (will be calculated after fuel plot)trans_max = trans_data.max()# PLOT 5: Average Price by Fuel Type (VERTICAL BARS)ax5 = fig.add_subplot(gs[1, 1])fuel_data = df.groupby('fuelType')['price'].mean().sort_values(ascending=False)# Create gradient colorscolors_fuel = plt.cm.plasma(np.linspace(0.2, 0.8, len(fuel_data)))bars5 = ax5.bar(range(len(fuel_data)), fuel_data.values, color=colors_fuel, alpha=0.85, edgecolor='#2d3436', linewidth=2.5)ax5.set_xticks(range(len(fuel_data)))ax5.set_xticklabels(fuel_data.index, rotation=45, ha='right', fontsize=11, fontweight='bold')ax5.set_ylabel('Average Price ($)', fontsize=13, fontweight='bold', color='#2d3436')ax5.set_title('Average Price by Fuel Type', fontsize=15, fontweight='bold', pad=20, color='#1a1a2e')ax5.grid(True, alpha=0.25, axis='y', linestyle='--', linewidth=0.8)ax5.set_facecolor('#f8f9fa')# Add value labels on barsfor i, bar inenumerate(bars5): height = bar.get_height() ax5.text(bar.get_x() + bar.get_width()/2., height,f'${height:,.0f}', ha='center', va='bottom', fontsize=11, fontweight='bold', color='#2d3436', bbox=dict(boxstyle='round,pad=0.3', facecolor='white', alpha=0.8))# Set same Y-axis scale for both bar charts for better comparisonfuel_max = fuel_data.max()y_max =max(trans_max, fuel_max) *1.15# Add 15% paddingax4.set_ylim(0, y_max)ax5.set_ylim(0, y_max)plt.tight_layout()plt.show()
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
findfont: Generic family 'sans-serif' not found because none of the following families were found: Arial
Recommendations and Implications
1.Rebalance Inventory Using Price Elasticity
Recommendation:
Shift inventory toward mid-range and economy vehicles, as these segments show the highest demand and offer steady margins. Keep premium models in smaller quantities but price them higher to maintain exclusivity.
Implication:
This approach improves overall turnover, reduces holding costs, and ensures the dealership stocks cars that align with real market demand patterns.
2.Apply Premium Pricing for Engine Size & Automatic Transmissions
Recommendation:
Introduce consistent pricing rules such as adding a fixed premium for larger engines (e.g., +$1,000 per 0.5L) and pricing automatic variants 8–12% higher across the board.
Implication:
Feature-based pricing improves transparency, strengthens customer trust, and increases margins by charging appropriately for in-demand specifications.
3.Use Depreciation-Adjusted Stock Rotation for Aging Vehicles
Recommendation:
Move older or high-mileage inventory faster by using timed discounts and offering service bundles for slow-moving models.
Implication:
This minimizes depreciation losses, improves cash flow, and keeps the dealership’s inventory fresh and competitive.
4.Use Customer Segmentation for Targeted Marketing & Reduced Negotiation
Recommendation:
Customer segmentation can be used to customize marketing and price by discriminating between value purchasers, who prioritize high-MPG, low-maintenance, inexpensive automobiles, and performance buyers, who prefer high-engine, lower-MPG, luxury or performance models. Position efficient automobiles as “Low Ownership Cost” options, and higher-engine vehicles as premium or performance options, tailoring promotions and communication to each consumer profile.
Implication:
This personalized strategy eliminates negotiation friction, promotes customer happiness, and boosts conversion by ensuring buyers are quickly presented with vehicles that match their goals and budget. It improves marketing clarity and makes the dealership’s product offering appear more relevant and tailored to each consumer segment.
Final Recommendation:
Customer segmentation can be used to customize marketing and price by discriminating between value purchasers, who prioritize high-MPG, low-maintenance, inexpensive automobiles, and performance buyers, who prefer high-engine, lower-MPG, luxury or performance models. Position efficient automobiles as “Low Ownership Cost” options, and higher-engine vehicles as premium or performance options, tailoring promotions and communication to each consumer profile.
Final Implication:
This targeted approach reduces negotiation friction, improves customer satisfaction, and increases conversion by ensuring buyers immediately encounter vehicles that match their priorities and budget. It strengthens marketing clarity and makes the dealership’s product offering feel more relevant and personalised to each customer segment.
Conclusion
According to the data, pricing, customer demand, and brand impression are all influenced by a small number of essential vehicle features, namely mileage, year, engine size, MPG, and gearbox. Using these insights, the dealership can transition from intuition-based decisions to a fully data-driven strategy that establishes optimal prices, targets the appropriate consumer categories, and presents each brand successfully.
Overall, the findings conclude that data-driven pricing and segmentation create the strongest path to higher margins, faster inventory turnover, and more relevant marketing in the competitive used-car market.